//备注：拷贝代码请加上作者信息
//作者：王海涛
//邮箱：1126471088@qq.com
//版本：V1.0.0
/********************************************************
    说明：
    1、DAC输出通道1对应PA4，DAC输出通道2对应PA5
    2、DAC通道数据均采用右对齐模式。
    3、双通道输出的时候，通道2 DMA必须失能。
    4、支持启动和停止操作。如果配置双通道，需要逐个启动或停止。
    5、支持动态配置DMA操作。
    6、基于stm32f4xx标准库V1.9.0
**********************************************************/
#ifndef __DAC_BSP_H__
#define __DAC_BSP_H__

#include "stm32f4xx.h"
#include "stm32f4xx_dac.h"
#include "../GPIO_BSP/gpio_bsp.h"
#include "../Timer_BSP/timer_bsp.h"
#include "../EXTI_BSP/exti_bsp.h"
#include "../DMA_BSP/dma_bsp.h"

/*12bit正弦波数据*/
#define Sin_12Bit_Buffer                            \
{                                                   \
    2048, 2460, 2856, 3218, 3532, 3786, 3969, 4072, \
	4093, 4031, 3887, 3668, 3382, 3042,	2661, 2255, \
	1841, 1435, 1054, 714 , 428	, 209 , 65	, 3	  , \
	24	, 127 , 310	, 564 , 878	, 1240, 1636, 2048, \
}

/*DAC通道枚举*/
typedef enum
{
    DAC_CH1 = DAC_Channel_1,
    DAC_CH2 = DAC_Channel_2,
}WHT_DAC_Channel_enum;

/*DAC数据类型枚举*/
typedef enum
{
    DAC_CH1_12Bit = DAC_BASE + 0x08,   //数据低12bit   2字节数据
    DAC_CH1_8Bit  = DAC_BASE + 0x10,   //数据低8bit    1字节数据
    DAC_CH2_12Bit = DAC_BASE + 0x14,   //数据低12bit   2字节数据
    DAC_CH2_8Bit  = DAC_BASE + 0x1C,   //数据低8bit    1字节数据
    DAC_CH1_2_12Bit = DAC_BASE + 0x20, //通道1使用0~11bit，通道2使用16~27it  4字节数据
    DAC_CH1_2_8Bit  = DAC_BASE + 0x28, //通道1使用0~7bit，通道2使用8~15bit   2字节数据
}WHT_DAC_Data_Type_enum;

/*DAC外部触发转换*/
typedef enum
{    
    DAC_Timer2_Trigger    =  DAC_Trigger_T2_TRGO,
    DAC_Timer4_Trigger    =  DAC_Trigger_T4_TRGO,
    DAC_Timer5_Trigger    =  DAC_Trigger_T5_TRGO,
    DAC_Timer6_Trigger    =  DAC_Trigger_T6_TRGO,
    DAC_Timer7_Trigger    =  DAC_Trigger_T7_TRGO,
    DAC_Timer8_Trigger    =  DAC_Trigger_T8_TRGO,
    DAC_Exit_Lin9_Trigger =  DAC_Trigger_Ext_IT9,
    DAC_Software_Trigger  =  DAC_Trigger_Software,
}WHT_DAC_Trigger_Mode_enum;

/*DAC定时器触发转换配置结构体*/
typedef struct
{
    WHT_Timer_enum Name;   //定时器号
    unsigned int Cycle_ns; //周期,范围14~59000000ns
}WHT_DAC_Timer_Trigger_t;

/*DAC外部引脚触发转换配置结构体*/
typedef struct
{
    WHT_GPIO_Port_enum Portx; //端口
    WHT_GPIO_Pin_enum Pinx;   //引脚
}WHT_DAC_EXTI_Trigger_t;

/*DAC DMA功能配置结构体*/
typedef struct
{
    FunctionalState state;//当DAC双通道情况下，通道2不要开启DMA
    WHT_DAC_Data_Type_enum Data_Type;
    void* Buffer;
    unsigned short Count;
}WHT_DAC_DMA_t;

/*DAC配置结构体*/
typedef struct
{
    WHT_DAC_Channel_enum Channel;    //通道
    WHT_GPIO_Port_enum Channel_Port; //通道端口
    WHT_GPIO_Pin_enum Channel_Pin;   //通道引脚
    WHT_DAC_Trigger_Mode_enum Trigger_Mode;//触发选择
    void* Trigger_Config;
    WHT_DAC_DMA_t* DMA_Config;
}WHT_DAC_Config_t;

/*DAC回调函数结构体*/
typedef struct
{
    void (*WHT_Config)(const WHT_DAC_Config_t* config);
    void (*WHT_Start_Stop)(WHT_DAC_Channel_enum Channel, FunctionalState state);     //启停DAC输出
    void (*WHT_Reset_DMA)(WHT_DAC_Channel_enum Channel, const WHT_DAC_DMA_t* config);//重置DMA配置
    void (*WHT_Write)(WHT_DAC_Data_Type_enum data_type, unsigned int value);         //手动写数据
}WHT_DAC_BSP_t;

/*全局常量*/
extern const WHT_DAC_BSP_t WHT_DAC_BSP;

#endif // !__DAC_BSP_H__
